約 4,315,288 件
https://w.atwiki.jp/mi_ic2/pages/134.html
TileEntityCrop 私はこのコードについて真に驚くべき解説ができるが、ここに記すには@Wikiの制限容量が少なすぎる。 バージョン: industrialcraft-2-2.2.828-experimental package ic2.core.crop; import ic2.api.crops.BaseSeed; import ic2.api.crops.CropCard; import ic2.api.crops.Crops; import ic2.api.crops.ICropTile; import ic2.api.network.INetworkDataProvider; import ic2.api.network.INetworkUpdateListener; import ic2.core.IC2; import ic2.core.Ic2Items; import ic2.core.block.machine.tileentity.TileEntityCropmatron; import ic2.core.item.ItemCropSeed; import ic2.core.network.NetworkManager; import ic2.core.util.StackUtil; import ic2.core.util.Util; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.StatCollector; import net.minecraft.world.EnumSkyBlock; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.oredict.OreDictionary; public class TileEntityCrop extends TileEntity implements INetworkDataProvider, INetworkUpdateListener, ICropTile { public byte humidity = -1; public byte nutrients = -1; public byte airQuality = -1; private static final boolean debug = false; private CropCard crop = null; public int size = 0; public int statGrowth = 0; public int statGain = 0; public int statResistance = 0; public int scanLevel = 0; public NBTTagCompound customData = new NBTTagCompound(); public int nutrientStorage = 0; public int waterStorage = 0; public int exStorage = 0; public int growthPoints = 0; public boolean upgraded = false; public char ticker; public boolean dirty; public static int tickRate = 256; public int weedlevel; public int Infestedlevel; public TileEntityCrop() { this.ticker = (char)IC2.random.nextInt(tickRate); this.dirty = true; this.weedlevel = 0; this.Infestedlevel = 0; } public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); if (nbt.hasKey( cropOwner ) nbt.hasKey( cropName )) { this.crop = Crops.instance.getCropCard(nbt.getString( cropOwner ), nbt.getString( cropName )); } else if (nbt.hasKey( cropid )) { this.crop = IC2Crops.getCropFromId(nbt.getShort( cropid )); } this.size = nbt.getByte( size ); this.statGrowth = nbt.getByte( statGrowth ); this.statGain = nbt.getByte( statGain ); this.statResistance = nbt.getByte( statResistance ); if (nbt.hasKey( data0 )) { for(int x = 0; x 16; ++x) { this.customData.setShort( legacy + x, nbt.getShort( data + x)); } } else if (nbt.hasKey( customData )) { this.customData = nbt.getCompoundTag( customData ); } this.growthPoints = nbt.getInteger( growthPoints ); this.nutrientStorage = nbt.getInteger( nutrientStorage ); this.waterStorage = nbt.getInteger( waterStorage ); this.exStorage = nbt.getInteger( exStorage ); this.upgraded = nbt.getBoolean( upgraded ); this.scanLevel = nbt.getByte( scanLevel ); this.weedlevel = nbt.getInteger( weedlevel ); this.Infestedlevel = nbt.getInteger( Infestedlevel ); } public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); if (this.crop != null) { nbt.setString( cropOwner , this.crop.owner()); nbt.setString( cropName , this.crop.name()); } nbt.setByte( size , (byte)this.size); nbt.setByte( statGrowth , (byte)this.statGrowth); nbt.setByte( statGain , (byte)this.statGain); nbt.setByte( statResistance , (byte)this.statResistance); nbt.setTag( customData , this.customData); nbt.setInteger( growthPoints , this.growthPoints); nbt.setInteger( nutrientStorage , this.nutrientStorage); nbt.setInteger( waterStorage , this.waterStorage); nbt.setInteger( exStorage , this.exStorage); nbt.setBoolean( upgraded , this.upgraded); nbt.setByte( scanLevel , (byte)this.scanLevel); nbt.setInteger( weedlevel , this.weedlevel); nbt.setInteger( Infestedlevel , this.Infestedlevel); } public void updateEntity() { super.updateEntity(); ++this.ticker; if (this.ticker % tickRate == 0) { this.tick();// 256MinecraftTickに1回呼ばれる } if (this.dirty) {// 更新が必要なら更新する this.dirty = false; this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); this.worldObj.updateLightByType(EnumSkyBlock.Block, this.xCoord, this.yCoord, this.zCoord); if (IC2.platform.isSimulating()) { Iterator var1 = this.getNetworkedFields().iterator(); while(var1.hasNext()) { String field = (String)var1.next(); ((NetworkManager)IC2.network.get()).updateTileEntityField(this, field); } } } } public List getNetworkedFields() { List ret = new ArrayList(4); ret.add( crop ); ret.add( size ); ret.add( upgraded ); ret.add( customData ); ret.add( weedlevel ); ret.add( Infestedlevel ); return ret; } public void tick() { if (IC2.platform.isSimulating()) { if (this.ticker % (tickRate 2) == 0) {// 1024Minecraftに1度、位相そのまま this.humidity = this.updateHumidity(); } if ((this.ticker + tickRate) % (tickRate 2) == 0) {// 1024Minecraftに1度、上の256tick前 this.nutrients = this.updateNutrients(); } if ((this.ticker + tickRate * 2) % (tickRate 2) == 0) {// 1024Minecraftに1度、上の256tick前 this.airQuality = this.updateAirQuality(); } if (this.crop == null) { if (!this.upgraded || !this.attemptCrossing()) {// upgradedなら何もしない、upgradedでないなら交配試行して成功したらスルー、交配失敗だと内部を実行 if (IC2.random.nextInt(100) != 0 || this.hasEx()) { if (this.exStorage 0 IC2.random.nextInt(10) == 0) { --this.exStorage; } return; } this.reset(); this.crop = IC2Crops.weed; this.size = 1; } assert this.crop != null; } this.crop.tick(this); if (this.crop.canGrow(this)) { this.growthPoints += this.calcGrowthRate(); if (this.crop == null) { return; } if (this.growthPoints = this.crop.growthDuration(this)) { this.growthPoints = 0; ++this.size; this.dirty = true; } } if (this.nutrientStorage 0) { --this.nutrientStorage; } if (this.waterStorage 0) { --this.waterStorage; } if (this.crop.isWeed(this) IC2.random.nextInt(50) - this.statGrowth = 2) { this.generateWeed(); } } } public void generateWeed() { int x = this.xCoord; int y = this.yCoord; int z = this.zCoord; switch(IC2.random.nextInt(4)) { case 0 ++x;// breakが足りない case 1 --x;// breakが足りない case 2 ++z;// breakが足りない case 3 --z; } if (this.worldObj.getTileEntity(x, y, z) instanceof TileEntityCrop) { TileEntityCrop teCrop = (TileEntityCrop)this.worldObj.getTileEntity(x, y, z); CropCard neighborCrop = teCrop.getCrop(); if (neighborCrop == null || !neighborCrop.isWeed(teCrop) IC2.random.nextInt(32) = teCrop.statResistance !teCrop.hasEx()) { int newGrowth = Math.max(this.statGrowth, teCrop.statGrowth); if (newGrowth 31 IC2.random.nextBoolean()) { ++newGrowth; } teCrop.reset(); teCrop.crop = IC2Crops.weed; teCrop.size = 1; teCrop.statGrowth = (byte)newGrowth; } } else if (this.worldObj.isAirBlock(x, y, z)) { Block block = this.worldObj.getBlock(x, y - 1, z); if (block == Blocks.dirt || block == Blocks.grass || block == Blocks.farmland) { this.worldObj.setBlock(x, y - 1, z, Blocks.grass, 0, 7); this.worldObj.setBlock(x, y, z, Blocks.tallgrass, 1, 7); } } } public boolean hasEx() { if (this.exStorage 0) { this.exStorage -= 5; return true; } else { return false; } } public boolean attemptCrossing() { if (IC2.random.nextInt(3) != 0) {// 確率で無条件失敗 return false; } else { List cropTes = new ArrayList(4);// 交配参加可能植物を列挙 this.askCropJoinCross(this.xCoord - 1, this.yCoord, this.zCoord, cropTes); this.askCropJoinCross(this.xCoord + 1, this.yCoord, this.zCoord, cropTes); this.askCropJoinCross(this.xCoord, this.yCoord, this.zCoord - 1, cropTes); this.askCropJoinCross(this.xCoord, this.yCoord, this.zCoord + 1, cropTes); if (cropTes.size() 2) {// 参加可能が2個未満で失敗 return false; } else { CropCard[] crops = (CropCard[])Crops.instance.getCrops().toArray(new CropCard[0]);// 全植物を列挙 if (crops.length == 0) {// 植物がないときは失敗 return false; } else { int[] ratios = new int[crops.length];// ここまでの累積交配比重 int total = 0; int search;// 全植物の交配比重の合計を計算 for(search = 0; search ratios.length; ++search) { CropCard crop = crops[search]; TileEntityCrop te; if (crop.canGrow(this)) { for(Iterator var7 = cropTes.iterator(); var7.hasNext(); total += this.calculateRatioFor(crop, te.getCrop())) { te = (TileEntityCrop)var7.next(); } } ratios[search] = total; } search = IC2.random.nextInt(total);// 累積交配比重に準じた乱数 int min = 0; int max = ratios.length - 1; int count; while(min max) {// minをsearchに対応したcropsのインデックスにする count = (min + max) / 2; int value = ratios[count]; if (search value) { max = count; } else { min = count + 1; } } assert min == max; assert min = 0 min ratios.length; assert ratios[min] search; assert min == 0 || ratios[min - 1] = search; this.upgraded = false; this.crop = crops[min]; this.dirty = true; this.size = 1; this.statGrowth = 0; this.statResistance = 0; this.statGain = 0; TileEntityCrop te;// 交配参加した作物の合計計算 for(Iterator var13 = cropTes.iterator(); var13.hasNext(); this.statGain += te.statGain) { te = (TileEntityCrop)var13.next(); this.statGrowth += te.statGrowth; this.statResistance += te.statResistance; } count = cropTes.size(); this.statGrowth /= count; this.statResistance /= count; this.statGain /= count;// ここまででGGRが交配参加した作物の平均になっている this.statGrowth += IC2.random.nextInt(1 + 2 * count) - count;// -count~count this.statGain += IC2.random.nextInt(1 + 2 * count) - count; this.statResistance += IC2.random.nextInt(1 + 2 * count) - count; this.statGrowth = Util.limit(this.statGrowth, 0, 31); this.statGain = Util.limit(this.statGain, 0, 31); this.statResistance = Util.limit(this.statResistance, 0, 31); return true; } } } } public int calculateRatioFor(CropCard newCrop, CropCard oldCrop) { if (newCrop == oldCrop) {// 同一植物だと500 return 500; } else { int value = 0;// 交配比重、初期値0 int diff;// statが完全に同一の時+10、statが1ずれるごとに-1のペナルティ int delta; for(diff = 0; diff 5; ++diff) { delta = Math.abs(newCrop.stat(diff) - oldCrop.stat(diff)); value += -delta + 2; } String[] var12 = newCrop.attributes();// 属性が大文字小文字無視で一致するごとに+5 delta = var12.length; for(int var6 = 0; var6 delta; ++var6) { String attributeNew = var12[var6]; String[] var8 = oldCrop.attributes(); int var9 = var8.length; for(int var10 = 0; var10 var9; ++var10) { String attributeOld = var8[var10]; if (attributeNew.equalsIgnoreCase(attributeOld)) { value += 5; } } } diff = newCrop.tier() - oldCrop.tier();// Tier増分が正の場合2倍ペナルティ、負の場合1倍ペナルティ if (diff 1) { value -= 2 * diff; } if (diff -3) { value -= -diff; } return Math.max(value, 0); } } public void askCropJoinCross(int x, int y, int z, List crops) { TileEntity te = this.worldObj.getTileEntity(x, y, z); if (te instanceof TileEntityCrop) {// ブロックが支柱で、 TileEntityCrop sideCrop = (TileEntityCrop)te; CropCard neighborCrop = sideCrop.getCrop(); if (neighborCrop != null) {// 植物が存在し、 if (neighborCrop.canGrow(this) neighborCrop.canCross(sideCrop)) {// その植物種が交配後の位置で成長可能であり、交配前の位置で交配可能である場合、 int base = 4;// 初期値4 if (sideCrop.statGrowth = 16) {// Gr16で1のボーナス ++base; } if (sideCrop.statGrowth = 30) {// Gr30で1のボーナス ++base; } if (sideCrop.statResistance = 28) {// Re28以降1ずつペナルティ base += 27 - sideCrop.statResistance; } if (base = IC2.random.nextInt(20)) {// (base + 1) / 20が交配参加確率。 crops.add(sideCrop); } } } } } public boolean leftClick(EntityPlayer player) { if (this.crop == null) { if (this.upgraded) { this.upgraded = false; this.dirty = true; if (IC2.platform.isSimulating()) { StackUtil.dropAsEntity(this.worldObj, this.xCoord, this.yCoord, this.zCoord, new ItemStack(Ic2Items.crop.getItem())); } return true; } else { return false; } } else { return this.crop.leftclick(this, player); } } public boolean pick(boolean manual) { if (this.crop == null) { return false; } else { boolean bonus = this.harvest(false); float firstchance = this.crop.dropSeedChance(this); int drop; for(drop = 0; drop this.statResistance; ++drop) { firstchance *= 1.1F; } drop = 0; int x; if (bonus) { if (IC2.random.nextFloat() = (firstchance + 1.0F) * 0.8F) { ++drop; } float chance = this.crop.dropSeedChance(this) + (float)this.statGrowth / 100.0F; if (!manual) { chance *= 0.8F; } for(x = 23; x this.statGain; ++x) { chance *= 0.95F; } if (IC2.random.nextFloat() = chance) { ++drop; } } else if (IC2.random.nextFloat() = firstchance * 1.5F) { ++drop; } ItemStack[] re = new ItemStack[drop]; for(x = 0; x drop; ++x) { re[x] = this.crop.getSeeds(this); } this.reset(); if (IC2.platform.isSimulating() re.length 0) { for(x = 0; x re.length; ++x) { if (re[x].getItem() != Ic2Items.cropSeed.getItem()) { re[x].stackTagCompound = null; } StackUtil.dropAsEntity(this.worldObj, this.xCoord, this.yCoord, this.zCoord, re[x]); } } return true; } } public boolean rightClick(EntityPlayer player) { ItemStack current = player.getCurrentEquippedItem(); boolean creative = player.capabilities.isCreativeMode; if (current != null) { if (this.crop == null) { if (current.getItem() == Ic2Items.crop.getItem() !this.upgraded) { if (!creative) { --current.stackSize; if (current.stackSize = 0) { player.inventory.mainInventory[player.inventory.currentItem] = null; } } this.upgraded = true; this.dirty = true; return true; } if (this.applyBaseSeed(player)) { return true; } } if (current.getItem() == Items.water_bucket || current.getItem() == Ic2Items.waterCell.getItem()) { if (this.waterStorage 10) { this.waterStorage = 10; return true; } return current.getItem() == Items.water_bucket; } if (current.getItem() == Items.wheat_seeds) { if (this.nutrientStorage = 50) { this.nutrientStorage += 25; --current.stackSize; if (current.stackSize = 0) { player.inventory.mainInventory[player.inventory.currentItem] = null; } return true; } return false; } if (current.getItem() == Items.dye current.getItemDamage() == 15 || current.getItem() == Ic2Items.fertilizer.getItem()) { if (this.applyFertilizer(true)) { if (creative) { return true; } else { --current.stackSize; if (current.stackSize = 0) { player.inventory.mainInventory[player.inventory.currentItem] = null; } return true; } } else { return false; } } if (current.getItem() == Ic2Items.hydratingCell.getItem()) { if (this.applyHydration(true, current, player)) { if (current.stackSize = 0) { player.inventory.mainInventory[player.inventory.currentItem] = null; } return true; } return false; } if (current.getItem() == Ic2Items.weedEx.getItem() this.applyWeedEx(true)) { current.damageItem(1, player); if (current.stackSize = 0) { player.inventory.mainInventory[player.inventory.currentItem] = null; } return true; } } if (this.crop == null) { return false; } else { return this.crop.rightclick(this, player); } } public boolean applyBaseSeed(EntityPlayer player) { ItemStack current = player.getCurrentEquippedItem(); BaseSeed seed = Crops.instance.getBaseSeed(current); if (seed != null) { if (current.stackSize seed.stackSize) { return false; } if (this.tryPlantIn(seed.crop, seed.size, seed.statGrowth, seed.statGain, seed.statResistance, 1)) { if (player.capabilities.isCreativeMode) { return true; } if (current.getItem().hasContainerItem(current)) { if (current.stackSize 1) { return false; } player.inventory.mainInventory[player.inventory.currentItem] = current.getItem().getContainerItem(current); } else { current.stackSize -= seed.stackSize; if (current.stackSize = 0) { player.inventory.mainInventory[player.inventory.currentItem] = null; } } return true; } } return false; } public boolean tryPlantIn(CropCard crop, int si, int statGr, int statGa, int statRe, int scan) { if (crop != null crop != IC2Crops.weed !this.upgraded) { if (!crop.canGrow(this)) { return false; } else { this.reset(); this.crop = crop; this.size = (byte)si; this.statGrowth = (byte)statGr; this.statGain = (byte)statGa; this.statResistance = (byte)statRe; this.scanLevel = (byte)scan; return true; } } else { return false; } } public boolean applyFertilizer(boolean manual) { if (this.nutrientStorage = 100) { return false; } else { this.nutrientStorage += manual ? 100 90; return true; } } public boolean applyHydration(TileEntityCropmatron cropmatron) { if (this.waterStorage = 200) { return false; } else { int apply = 200 - this.waterStorage; FluidStack drain = cropmatron.getFluidTank().drain(apply, true); if (drain != null) { this.waterStorage += drain.amount; return true; } else { return false; } } } public boolean applyHydration(boolean manual, ItemStack itemStack, EntityPlayer player) { if ((manual || this.waterStorage 180) this.waterStorage 200) { int apply = manual ? 200 - this.waterStorage 180 - this.waterStorage; apply = Math.min(apply, itemStack.getMaxDamage() - itemStack.getItemDamage()); if (!player.capabilities.isCreativeMode itemStack.attemptDamageItem(apply, IC2.random)) { player.inventory.mainInventory[player.inventory.currentItem] = Ic2Items.cell; } this.waterStorage += apply; return true; } else { return false; } } public boolean applyWeedEx(boolean manual) { if ((this.exStorage 100 || !manual) this.exStorage 150) { this.exStorage += 50; boolean triggerDecline; if (manual) { triggerDecline = this.worldObj.rand.nextInt(5) == 0; } else { triggerDecline = this.worldObj.rand.nextInt(3) == 0; } if (this.crop != null this.crop.isWeed(this) this.exStorage = 75 triggerDecline) { switch(this.worldObj.rand.nextInt(5)) { case 0 if (this.statGrowth 0) { --this.statGrowth; } case 1 if (this.statGain 0) { --this.statGain; } default if (this.statResistance 0) { --this.statResistance; } } } return true; } else { return false; } } public ItemStack[] harvest_automated(boolean optimal) { if (this.crop == null) { return null; } else if (!this.crop.canBeHarvested(this)) { return null; } else if (optimal this.size != this.crop.getOptimalHavestSize(this)) { return null; } else { double chance = (double)this.crop.dropGainChance(); chance *= Math.pow(1.03D, (double)this.statGain); int dropCount = (int)Math.max(0L, Math.round(IC2.random.nextGaussian() * chance * 0.6827D + chance)); ItemStack[] ret = new ItemStack[dropCount]; for(int i = 0; i dropCount; ++i) { ret[i] = this.crop.getGain(this); if (ret[i] != null IC2.random.nextInt(100) = this.statGain) { ++ret[i].stackSize; } } this.size = this.crop.getSizeAfterHarvest(this); this.dirty = true; return ret; } } public boolean harvest(boolean manual) { ItemStack[] drops = this.harvest_automated(false); if (drops == null) { return false; } else { if (IC2.platform.isSimulating() drops.length 0) { ItemStack[] var3 = drops; int var4 = drops.length; for(int var5 = 0; var5 var4; ++var5) { ItemStack drop = var3[var5]; StackUtil.dropAsEntity(this.worldObj, this.xCoord, this.yCoord, this.zCoord, drop); } } return true; } } public void onNeighbourChange() { if (this.crop != null) { this.crop.onNeighbourChange(this); } } public int emitRedstone() { return this.crop == null ? 0 this.crop.emitRedstone(this); } public void onBlockDestroyed() { if (this.crop != null) { this.crop.onBlockDestroyed(this); } } public int getEmittedLight() { return this.crop == null ? 0 this.crop.getEmittedLight(this); } public byte getHumidity() { if (this.humidity == -1) { this.humidity = this.updateHumidity(); } return this.humidity; } public byte getNutrients() { if (this.nutrients == -1) { this.nutrients = this.updateNutrients(); } return this.nutrients; } public byte getAirQuality() { if (this.airQuality == -1) { this.airQuality = this.updateAirQuality(); } return this.airQuality; } public byte updateHumidity() { int value = Crops.instance.getHumidityBiomeBonus(this.worldObj.getBiomeGenForCoords(this.xCoord, this.zCoord)); if (this.worldObj.getBlockMetadata(this.xCoord, this.yCoord - 1, this.zCoord) = 7) { value += 2; } if (this.waterStorage = 5) { value += 2; } value += (this.waterStorage + 24) / 25; return (byte)value; } public byte updateNutrients() { int value = Crops.instance.getNutrientBiomeBonus(this.worldObj.getBiomeGenForCoords(this.xCoord, this.zCoord)); for(int i = 2; i 5 this.worldObj.getBlock(this.xCoord, this.yCoord - i, this.zCoord) == Blocks.dirt; ++i) { ++value; } value += (this.nutrientStorage + 19) / 20; return (byte)value; } public byte updateAirQuality() { int value = 0; int height = (this.yCoord - 64) / 15; if (height 4) { height = 4; } if (height 0) { height = 0; } int value = value + height; int fresh = 9; for(int x = this.xCoord - 1; x = this.xCoord + 1 fresh 0; ++x) { for(int z = this.zCoord - 1; z = this.zCoord + 1 fresh 0; ++z) { if (this.worldObj.isBlockNormalCubeDefault(x, this.yCoord, z, false) || this.worldObj.getTileEntity(x, this.yCoord, z) instanceof TileEntityCrop) { --fresh; } } } value += fresh / 2; if (this.worldObj.canBlockSeeTheSky(this.xCoord, this.yCoord + 1, this.zCoord)) { value += 2; } return (byte)value; } public int updateMultiCulture() { Set crops = new HashSet(); for(int x = -1; x 1; ++x) { for(int z = -1; z 1; ++z) { TileEntity te = this.worldObj.getTileEntity(x + this.xCoord, this.yCoord, z + this.zCoord); if (te instanceof TileEntityCrop) { CropCard neighborCrop = ((TileEntityCrop)te).getCrop(); if (neighborCrop != null) { crops.add(neighborCrop); } } } } return crops.size() - 1; } public void addIfNotPresent(CropCard crop, LinkedList crops) { for(int i = 0; i crops.size(); ++i) { if (crop == crops.get(i)) { return; } } crops.add(crop); } public int calcGrowthRate() { if (this.crop == null) { return 0; } else { int base = 3 + IC2.random.nextInt(7) + this.statGrowth; int need = (this.crop.tier() - 1) * 4 + this.statGrowth + this.statGain + this.statResistance; if (need 0) { need = 0; } int have = this.crop.weightInfluences(this, (float)this.getHumidity(), (float)this.getNutrients(), (float)this.getAirQuality()) * 5; if (have = need) { base = base * (100 + (have - need)) / 100; } else { int neg = (need - have) * 4; if (neg 100 IC2.random.nextInt(32) this.statResistance) { this.reset(); base = 0; } else { base = base * (100 - neg) / 100; if (base 0) { base = 0; } } } return base; } } public void calcTrampling() { if (IC2.platform.isSimulating()) { if (IC2.random.nextInt(100) == 0 IC2.random.nextInt(40) this.statResistance) { this.reset(); this.worldObj.setBlock(this.xCoord, this.yCoord - 1, this.zCoord, Blocks.dirt, 0, 7); } } } public void onEntityCollision(Entity entity) { if (this.crop != null) { if (this.crop.onEntityCollision(this, entity)) { this.calcTrampling(); } } } public void reset() { this.crop = null; this.size = 0; this.customData = new NBTTagCompound(); this.dirty = true; this.statGain = 0; this.statResistance = 0; this.statGrowth = 0; this.nutrients = -1; this.airQuality = -1; this.humidity = -1; this.growthPoints = 0; this.upgraded = false; this.scanLevel = 0; } public void updateState() { this.dirty = true; } public String getScanned() { if (this.crop == null) { return null; } else if (this.scanLevel = 0) { return null; } else { String name = StatCollector.translateToLocal(this.crop.displayName()); return this.scanLevel = 4 ? String.format( %s - Gr %d Ga %d Re %d S %d/%d , name, this.statGrowth, this.statGain, this.statResistance, this.size, this.crop.maxSize()) String.format( %s - Size %d/%d , name, this.size, this.crop.maxSize()); } } public boolean isBlockBelow(Block reqBlock) { if (this.crop == null) { return false; } else { for(int i = 1; i this.crop.getrootslength(this); ++i) { Block block = this.worldObj.getBlock(this.xCoord, this.yCoord - i, this.zCoord); if (block.isAir(this.worldObj, this.xCoord, this.yCoord - i, this.zCoord)) { return false; } if (block == reqBlock) { return true; } } return false; } } public boolean isBlockBelow(String oreDictionaryName) { if (this.crop == null) { return false; } else { for(int i = 1; i this.crop.getrootslength(this); ++i) { Block block = this.worldObj.getBlock(this.xCoord, this.yCoord - i, this.zCoord); int metaData = this.worldObj.getBlockMetadata(this.xCoord, this.yCoord - i, this.zCoord); if (block.isAir(this.worldObj, this.xCoord, this.yCoord - i, this.zCoord)) { return false; } for(int aux = 0; aux OreDictionary.getOres(oreDictionaryName).size(); ++aux) { ItemStack itemStack = (ItemStack)OreDictionary.getOres(oreDictionaryName).get(aux); if (itemStack.getItem() == Item.getItemFromBlock(block) itemStack.getItemDamage() == metaData) { return true; } } } return false; } } public ItemStack generateSeeds(CropCard crop, byte growth, byte gain, byte resis, byte scan) { return ItemCropSeed.generateItemStackFromValues(crop, growth, gain, resis, scan); } public ItemStack generateSeeds(short plant, byte growth, byte gain, byte resis, byte scan) { return this.generateSeeds(IC2Crops.getCropFromId(plant), growth, gain, resis, scan); } public void onNetworkUpdate(String field) { this.dirty = true; } public CropCard getCrop() { return this.crop; } public short getID() { return (short)Crops.instance.getIdFor(this.crop); } public byte getSize() { return (byte)this.size; } public byte getGrowth() { return (byte)this.statGrowth; } public byte getGain() { return (byte)this.statGain; } public byte getResistance() { return (byte)this.statResistance; } public byte getScanLevel() { return (byte)this.scanLevel; } public NBTTagCompound getCustomData() { return this.customData; } public int getNutrientStorage() { return this.nutrientStorage; } public int getHydrationStorage() { return this.waterStorage; } public int getWeedExStorage() { return this.exStorage; } public int getLightLevel() { return this.worldObj.getBlockLightValue(this.xCoord, this.yCoord, this.zCoord); } public void setCrop(CropCard cropCard) { this.crop = cropCard; this.dirty = true; } public void setID(short id) { this.setCrop(IC2Crops.getCropFromId(id)); } public void setSize(byte size1) { this.size = size1; this.dirty = true; } public void setGrowth(byte growth) { this.statGrowth = growth; } public void setGain(byte gain) { this.statGain = gain; } public void setResistance(byte resistance) { this.statResistance = resistance; } public void setScanLevel(byte scanLevel1) { this.scanLevel = scanLevel1; } public void setNutrientStorage(int nutrientStorage1) { this.nutrientStorage = nutrientStorage1; } public void setHydrationStorage(int hydrationStorage) { this.waterStorage = hydrationStorage; } public void setWeedExStorage(int weedExStorage) { this.exStorage = weedExStorage; } public World getWorld() { return this.worldObj; } public ChunkCoordinates getLocation() { return new ChunkCoordinates(this.xCoord, this.yCoord, this.zCoord); } public int getvisualweedlevel() { return this.weedlevel; } public int getvisualInfestedlevel() { if (this.Infestedlevel 10) { return 0; } else if (this.Infestedlevel 30) { return 1; } else if (this.Infestedlevel 50) { return 2; } else if (this.Infestedlevel 70) { return 3; } else { return this.Infestedlevel 90 ? 4 5; } } }
https://w.atwiki.jp/snunlimited/pages/167.html
STARITE CELLMATES! 1 EACH PERSON NEEDS A CELLMATE THAT THEY HAVE SOMETHING IN COMMON WITH! THE FOOTBALL PLAYER NEEDS TO ROOM WITH SOMEONE INVOLVED IN SPORTS! HINT1 GIVE ME A ATHLETIC ROOMMATE. HINT2 PLACE SOMETHING ELSE WHO PLAYS SPORTS IN HERE. HINT3 GIVE ME SOMEONE WHO PLAYS BASEBALL. クリア可能な言葉:BASEBALL PLAYER、PLAYER 2 THE HALFLING WAS CAPTURED DURING AN IMPORTANT QUEST! GIVE THE HALFLING A MEMBER OF HER ADVENTURING PARTY! HINT1 GIVE ME SOMEONE TO BRING ALONG ON ADVENTURES. HINT2 GIVE ME SOMEONE WHO WIELDS A SWORD. HINT3 I NEED A KNIGHT. クリア可能な言葉:DWARF、ELF(FANTASY))、HALFLING、KNIGHT 3 THE SAXOPHONE PLAYER MISSES MAKING MUSIC WITH OTHERS! WRITE SOMEONE TO JOIN THE BAND! HINT1 I NEED SOMEONE TO JOIN MY BAND. HINT2 GIVE ME SOMEONE ELSE WHO PLAYS MUSIC. HINT3 GIVE ME SOMEONE WHO CAN PLAY GUITAR. クリア可能な言葉:BASSIST、DRUMMER、GUITARIST 4 THE ACTRESS MISSES PRACTICING HER LINES WITH OTHER THESPIANS! WRITE SOMEONE FROM THE MOVIE INDUSTRY THAT SHE CAN PRACTICE WITH! HINT1 I NEED SOMEONE TO HELP ME PRACTICE MY SCRIPT. HINT2 GIVE ME SOMEONE WHO CAN ACT. HINT3 GIVE ME SOME KIND OF ACTOR. クリア可能な言葉:ACTOR、CAMERAMAN 5 THE SCIENTIST NEEDS SOMEONE TO SHARE CONCEPTS WITH! GIVE HIM ANOTHER MEMBER OF THE SCIENTIFIC COMMUNITY! HINT1 A SECOND SCIENTIFIC OPINION NEVER HURTS. HINT2 I NEED SOMEONE WHO KNOWS ABOUT BIOLOGY. HINT3 I WANT A BIOLOGIST TO TALK TO. クリア可能な言葉:BIOLOGIST、HACKER、MATHEMATICIAN 6 THE COSPLAYER IS A HUGE FAN OF VIDEO GAMES AND ANIME! CREATE SOMEONE FROM NERD CULTURE THAT HE CAN TALK TO! HINT1 I WANT TO ROOM WITH SOMEONE FROM NERD CULTURE. HINT2 I WANT TO MEET AN ANCIENT ASSASSIN. HINT3 GIVE ME A NINJA TO TRAIN WITH. クリア可能な言葉:GAMER、NINJA PRISON BREAK! 1 MAXWELL NEEDS TO ESCAPE PRISON! GIVE THE TIRED GUARD A PLACE TO SIT AND HE NIGHT UNLOCK THE GATE! HINT1 I'VE BEEN ON MY FEET TOO LONG. HINT2 I WOULD LOVE A PLACE TO SIT. HINT3 GIVE ME A CHAIR TO RELAX ON. クリア可能な言葉:CHAIR 2 THE GUARD UNLOCKED THE DOOR! NOW A GHOST STANDS IN THE WAY! IT CAN'T OPEN THE DOOR WITHOUT A PHYSICAL PRESENCE! HINT1 I NEED A PHYSICAL BODY. HINT2 GIVE ME SOMEONE TO POSSESS. HINT3 PLACE A HUMAN IN MY ROOM. クリア可能な言葉:HUMAN、PHYSICIAN 3 THE GHOST SCARED THE DOOR OPEN! NOW A PRISONER IS CRAVING A HEARTY MEAL! GIVE HIM SOMETHING FILLING! HINT1 GIVE ME SOMETHING HEARTY TO EAT. HINT2 GIVE ME MEAT FROM AN ANIMAL. HINT3 GIVE ME A STEAK. クリア可能な言葉:MEAT、STEAK 4 THE PRISONER DESTROYED THE DOOR! A CON MAN HAS AGREED TO HELP MAXWELL BUT HE NEEDS TO DISGUISE HIMSELF AS AN OFFICER TO FOOL THE CAMERA! HINT1 WHAT CAN I WEAR TO MAKE THE CAMERA THINK I'M AN OFFICER? HINT2 GIVE ME SOMETHING A POLICE MAN WEARS. HINT3 GIVE ME A POLICE HAT. クリア可能な言葉:POLICE HAT、POLICEMAN SUIT 5 RUNNING THE SECURITY SYSTEM IS A LONELY JOB! THE PROGRAMMER HAS BEEN HERE FOR TOO LONG AND MISSES HIS FURRY PET! GIVE HIM MAN'S BEST FRIEND! HINT1 I MISS MY PET. HINT2 GIVE ME A SMALL CANINE BREED. HINT3 GIVE ME A CORGI. クリア可能な言葉:DOG THE GAUNTLET! 1-1 COMPLETE THE GAUNTLET TO REACH THE STARITE! BEGIN BY GETTING OUT OF THIS ROOM! HINT1 ESCAPE FROM THIS ROOM. HINT2 USE THE BUTTON TO OPEN THE DOOR. HINT3 PLACE A BOX ON THE BUTTON AND LEAVE THE ROOM. クリア可能な言葉:BOX ボタンを押せればなんでもいい 1-2 A HALLWAY OF FIRE BLOCKS THE PATH! MAKE IT SAFELY THROUGH THE DOOR! HINT1 REACH THE END OF THE HALLWAY. HINT2 TRY TO EXTINGUISH THE FIRES. HINT3 USE WATER TO PUT OUT THE FLAMES. クリア可能な言葉:RAIN、WATER 2 MAKE IT THROUGH TO THE NEXT DOOR! BEWARE OF FALLING OBJECTS! HINT1 MAKE IT TO THE END OF THE HALL. HINT2 TRIPWIRES ACTIVATE BOOBY TRAPS. HINT3 STAND IN THE MIDDLE OF THE ROOM TO AVOID THE WALLS. クリア可能な言葉: 3 THE ROBOT GUARD STANDS WATCH! QUICKLY MAKE IT TO SAFETY! HINT1 MAKE IT TO THE DOOR WITHOUT BEING LOCKED IN THE ROOM. HINT2 USE ADJECTIVES TO HELP MAXWELL RUN FASTER. HINT3 APPLY SONIC TO MAXWELL AND RUN. クリア可能な言葉:FAST、SONIC 4 THE STARITE IS OPEN FOR THE TAKING! GRAB IT! HINT1 GRAB THE STARITE. HINT2 PLEASE GRAB THE STARITE. HINT3 IGNORE THE TRAP AND GRAB THE STARITE. クリア可能な言葉: 5 THE STARITE WAS DESTROYED! MAKE IT TO THE TIME MACHINE TO SET THINGS RIGHT! HINT1 REACH THE TIME MACHINE BY TAKING TH#E LONG WAY AROUND. HINT2 BRING THE KEY TO THE LOCKED DOOR. HINT3 WAIT ON THE SECOND FLOOR AND USE A FAN TO MOVE THE SPIKED BALL. クリア可能な言葉:SMALL、WINGS 6 TIME TO HEAD OUTSIDE! FLIP THE SWITCH TO OPEN THE DOOR! HINT1 FIND A WAY OUTSIDE. HINT2 MAXWELL IS TOO BIG FIT THROUGH THE DOOR. HINT3 APPLY SMALL TO MAXWELL AND GO UNDER THE DOOR. クリア可能な言葉:TINY 7 FIND A WAY TO TRAVERSE OVER THE PRIZON! WATCH FOR POTENTIAL HAZARDS! HINT1 MAKE IT TO THE PRISON ROOFTOP. HINT2 PRESS THE BUTTON TO OPEN THE GATES. HINT3 USE AN AIR VENT TO BLOW AN OBJECT INTO THE BUTTON. クリア可能な言葉:AIR VENT 8 LIGHTNING STORMS PROTECT THE TOP OF THIS PRISON! CROSS THE ROOF! HINT1 CAREFULLY CROSS THE ROOFTOP. HINT2 WAIT FOR THE LIGHTNING TO DISAPPEAR BEFORE CROSSING THE ROOF. HINT3 WATCH THE LIGHTNING TO LEARN THE RHYTHM. クリア可能な言葉: 9-1 MAKE IT TO THE TIME MACHINE BUT WATCH OUT FOR STRONG GUSTS! THOSE SPIKES ARE DANGEROUS! HINT1 AVOID THE SPIKES TO REACH THE TIME MACHINE. HINT2 WATCH THE LEAF TO DETERMINE WHEN TO MOVE. HINT3 RUN AS SOON AS THE LEAF REACHES THE SPIKES. クリア可能な言葉: 9-2 ALL OF THE CHALLENGES HAVE BEEN COMPLETED! NOW USE THE TIME MACHINE FOR A SECOND CHANCE TO GRAB THE STARITE! HINT1 HOP IN THE TIME MACHINE FOR A SECOND CHANCE. HINT2 USE THE TIME MACHINE TO TRAVEL TO THE PAST. HINT3 ACTIVATE THE TIME MACHINE. クリア可能な言葉: 10 THE STARITE HASN'T BEEN DESTROYED YET! GRAB IT! HINT1 GRAB THE STARITE WITHOUT TRIGGERING THE TRIPWIRE. HINT2 FIND ANOTHER WAY TO ENTER THE STARITE ROOM. HINT3 PULL THE SWITCH TO GAIN ACCESS TO THE STARITE. SHARDS STARVING SANTA! SKINNY SANTA THIS PRISON FOOD DOES NOT FOLLOW MY STRICT FATTENING DIET! クリア可能な言葉 CHICKEN(FOOD)、MEAT SPLASH OF COLOR! DEPRESSED MONOCHROME EASTER BUNNY LIVING HERE HINDERS MY CREATIVITY! HELP ME PAINT THIS EGG! クリア可能な言葉 PAINT WEREWOLF FANG! TOOTH FAIRY I WANT A FANG FROM THAT WEREWOLF! クリア可能な言葉 KNIFE、PLIERS BASIC NECESSITIES! SNIPER THESE WATCH TOWERS DON'T COME WITH A BATHROOM! クリア可能な言葉 SINK、TOILET ENLIGHTENING A KNIGHT! DARK KNIGHT I WANT TO TALK TO SOMEONE WHO WILL HELP ME DOWN THE RIGHTEOUS PATH! クリア可能な言葉 ALTAR BOY、MOTHER EVIL LOVES COMPANY! VILLAIN ALL SUPER VILLAINS HAVE AN EVIL ANIMAL COMPANION! I NEED ONE! クリア可能な言葉 ANIMAL、BAT FAR FROM GNOME! GNOME SHOW ME SOMETHING FROM THE YARD I WAS STOLEN FROM! クリア可能な言葉 CHAIR、FLOWER THE PRINCESS AND THE PRISON! ROGUE HELP BRIDGE THE GAP BETWEEN THE PRINCESS AND ME! クリア可能な言葉 WINGS TASTY ESCAPE! CHEF CONCEAL SOMETHING IN MY CAKE TO HELP MY FRIEND BURROW THROUGH THE PRISON WALLS! クリア可能な言葉 CANDLE、DRILL BLENDING IN. BREAKING OUT! CRUSADER GIVE ME SOMETHING TO BLEND INTO THE ENVIRONMENT AND MAKE MY ESCAPE! クリア可能な言葉 TREE、WOOD DREAM JOB! BOSS WE NEED SOMEONE WHO WOULD WANT TO WATCH THESE TELEVISIONS ALL DAY! クリア可能な言葉 CHILD、COMMENTATOR
https://w.atwiki.jp/bfgmatome/pages/140.html
ゲーム情報(登録されているタグ) シリーズ>Art of Murder ジャンル>アドベンチャー ジャンル>大容量ゲーム 製作会社>不明 言語>英語 コメント欄へ移動 ゲーム配布ページ 英語 http //www.bigfishgames.com/download-games/4297/art-of-murder-fbi-confidential/index.html 日本語 紹介文 A series of strange murders in New York has drawn the attention of FBI Agent Nicole Bonnet! Scour the gritty streets of Gotham as Agent Bonnet, unraveling the clues to the uncanny crimes in this thrilling Large File game. Follow the diabolical murderer`s trail across sprawling cityscapes, ancient ruins and shadow-hewn jungle depths! Can you piece together the sinister motive linking the crimes? Buy Art of Murder FBI Confidential today and find out! Warning Graphic Language Gritty, realistic graphics High-quality video cut-scenes Stop a demonic murderer! 画像 « » var ppvArray_0_5e8789b5a71ee1156a78fb6dce0c89c6 = new Array(); ppvArray_0_5e8789b5a71ee1156a78fb6dce0c89c6[0] = http //w.atwiki.jp/bfgmatome/?cmd=upload&act=open&page=Art+of+Murder%3A+FBI+Confidential&file=en_art-of-murder-fbi-confidential-screen1.jpg ; window.onload=function(){ ppvShow_0_5e8789b5a71ee1156a78fb6dce0c89c6(0); }; function ppvShow_0_5e8789b5a71ee1156a78fb6dce0c89c6(n){ if(!ppvArray_0_5e8789b5a71ee1156a78fb6dce0c89c6[n]){ alert( 画像がありません ); return; } ppv_0_5e8789b5a71ee1156a78fb6dce0c89c6$( ppv_img_0_5e8789b5a71ee1156a78fb6dce0c89c6 ).src=ppvArray_0_5e8789b5a71ee1156a78fb6dce0c89c6[n]; ppv_0_5e8789b5a71ee1156a78fb6dce0c89c6$( ppv_link_0_5e8789b5a71ee1156a78fb6dce0c89c6 ).href=ppvArray_0_5e8789b5a71ee1156a78fb6dce0c89c6[n]; ppv_0_5e8789b5a71ee1156a78fb6dce0c89c6$( ppv_prev_0_5e8789b5a71ee1156a78fb6dce0c89c6 ).href= javascript ppvShow_0_5e8789b5a71ee1156a78fb6dce0c89c6( +(n-1)+ ) ; ppv_0_5e8789b5a71ee1156a78fb6dce0c89c6$( ppv_next_0_5e8789b5a71ee1156a78fb6dce0c89c6 ).href= javascript ppvShow_0_5e8789b5a71ee1156a78fb6dce0c89c6( +(n+1)+ ) ; } function ppv_0_5e8789b5a71ee1156a78fb6dce0c89c6$(){ var elements = new Array(); for (var i = 0; i arguments.length; i++){ var element = arguments[i]; if (typeof element == string ) element = document.getElementById(element); if (arguments.length == 1) return element; elements.push(element); } return elements; } ボリューム レス一覧 120 :名無しさんの野望:2010/01/11(月) 01 15 57 ID 7HeyONLb 今日のart of muderは体験版がないけど買った人いる? 122 :名無しさんの野望:2010/01/12(火) 01 56 48 ID 6GD1bwqN . 120 美術館の壷のとこでつまってる ディスクでゲーム出てるんだなこれ 123 :名無しさんの野望:2010/01/13(水) 02 02 42 ID 4CLTYuBU . 122 ジャンルは何? スクショ見るとアイテム探しに見えるけどタイトルからすると パズル/アドベンチャー系? 124 :名無しさんの野望:2010/01/13(水) 03 33 22 ID ikB8351c . 123 シベリア系つーか普通のアドベンチャーかな 歩くの遅いのが気になる 125 :名無しさんの野望:2010/01/13(水) 10 00 59 ID 4CLTYuBU . 124 ありがと。セール終わったしちょっと待ってみる。 最近、昔定価で買ったゲームが次々セールでちょっと凹むw 127 :名無しさんの野望:2010/01/14(木) 13 38 19 ID /+Evjo0C art of muderだけどダブルクリックで走れたわ 128 :名無しさんの野望:2010/01/14(木) 23 12 56 ID wS6c9ArL . 127 それ踏まえて「遅い」のかと思ってたw コメント 名前 コメント トップページに戻る
https://w.atwiki.jp/reigaserver/pages/37.html
見出し Combat鯖推奨ClientMod span.plugin_treemenu3 ul{ list-style-type none; list-style-image none; } ul.treeline li not( last-child) before{ content ┣ ; } ul.treeline li last-child before{ content ┗ ; } span.cursor{ cursor pointer; text-decoration underline; font-weight bold; } ul.first_list{ padding 0; margin 0; } ※リンク説明※ CurseForge .....最大級のModダウンロードサイト Forum..... Minecraft Japan Forum (私個人のなかで現日本フォーラム)と MinecraftForum (海外公式マインクラフトフォーラム)のこと OfficialSite.....そのModの公式サイト Combat鯖推奨ClientMod BetterAchievement BetterAchievement for MC1.7.10 Forum OldForum
https://w.atwiki.jp/alienswarmsource/pages/28.html
Swarm Campaign Add-on Tutorial http //developer.valvesoftware.com/wiki/Swarm_Campaign_Add-on_Tutorial Swarm Campaign Add-on Tutorial キャンペーン チュートリアル There are five basic steps to creating your own custom campaign Add-ons for Alien Swarm Alien Swarmにカスタムキャンペーンを入れるには、5つのステップがあります。 1.Make an Add-on folder and content sub-folders. Add-onフォルダとsubフォルダを作っときます。 2.Create game assets and place them in the proper sub-folder. ふさわしいフォルダにゲームアセットを作って入れます。 3.Create metadata files and place them in the proper sub-folder. sabフォルダにメタデータを作って入れます。 4.Pack the contents of the Add-on folder into a .VPK file. vpkファイルの入っているAdd-onフォルダを用意します。 5.Create a homepage for the add-on where it can be downloaded by players. Install the Authoring Tools In order to author content for Alien Swarm, you will need to install the Alien Swarm Authoring Tools (SDK). This provides you with the applications and utilities you will need to create game content. Mainly, you will be using the Hammer application to create levels, and the other utilities to create custom textures and models. A description of how to create these assets is beyond the scope of this tutorial, but you can find useful information in the Alien Swarm Mapping Basics. Because the focus of this article is how to assemble the assets into a campaign Add-on, we will assume that you have already learned how to successfully create these assets from this point forward. The Authoring Tools provides an example Add-on campaign that has source examples. Create an Add-on folder To begin, navigate to the 'addons' folder of your Alien Swarm game install location. For most users, this will be similar to C \Program Files\Steam\steamapps\common\alien swarm\swarm\addons Note If you have a folder with a hyphen, i.e. "add-ons", make sure it's empty and go ahead and delete it. The correct folder has no hyphen "addons". To create your own addon campaign, create a new folder inside the 'addons' directory, and give it an appropriate name. This new folder will be the name of the .VPK file you'll ultimately create and distribute, so it's good practice to avoid spaces and use all lowercase letters. You may also include the game in the title, to differentiate it from add-ons for other titles, and optionally a version number. We'll use "infested" as the name of our addon. ...\swarm\addons\infested Conceptually, this add-on folder will serve as the base “game” folder for your assets, and will mirror the layout in the shipped .VPK files as we shall see below. Create primary game assets The assets you create will essentially append those shipped with the game. For a campaign, the primary assets are the .BSP files that are your individual missions. Make a folder called 'maps' inside your add-on project folder. This is where the .BSP files will go which will make up your individual missions ...\swarm\addons\infested\maps To define your campaign, you'll need a campaign file that defines the missions that are in it, which order they are played and where they exist on the campaign map. Create a new folder called 'resource' and inside that create another folder called 'campaigns'. In here will be your campaign file which (for the sake of this tutorial) you should just name 'infested_campaign.txt'. Use '...\swarm\addons\ExampleAddon\resource\campaigns\ExampleCampaign.txt' as an example. ...\swarm\addons\infested\resource\campaigns In your campaign file you should update the name of your campaign to something unique. The file explains what each entry does so go ahead and customize how you see fit. You may also optionally create custom .VTF texture images, custom .VMT material description files, and custom .MDL models which your maps can utilize. In order to keep the size of your add-on small, it's advisable to use as many textures and models from the game as possible. Additional .VMT and .VTF materials (see Creating a Material) should go under this folder ...\swarm\addons\infested\materials .MDL and related model files (see exporting and compiling a model) should go under here ...\swarm\addons\infested\models And materials for your models should go under here ...\swarm\addons\infested\materials\models It should be noted that Alien Swarm treats the /infested folder much the same way as the /swarm folder, so any folders you use inside the /materials and /models that you employ must also be present in your addon's folder. Create secondary game assets Secondary assets such as a campign map, mission maps, mission and objective thumbnail images not required, but they can give your campaign an extra level of polish. If you haven't already, go ahead and make a materials folder and a vgui folder inside of it. The campaign overview map is defined in the campaign file (we called it 'infested_campaign.txt'). The individual mission thumbnails and the mission overview maps are defined in the mission overview files ('...\swarm\resource\overviews\') ...\swarm\addons\infested\materials\vgui Campaign Map Inside the vgui folder you'll want to place your custom campaign map .VTF file, along with the .VMTs that reference it. You can call it whatever you want, but it's a good idea to include the name of your addon in the name of the file. Once you've created your custom campaign map image, you'll want to edit the campaign file (we called it 'infested_campaign.txt') to point to it. .VMT files which are used for interface elements such as campaign maps, thumbnails, etc., (I.e. Those typically found in the materials/vgui folder,) often need to specify an UnlitGeneric material. See L4D's Deadline vgui .VMT File for an example. Mission Thumbnail In addition to the campaign map image, you'll also want to make thumbnail images for each map in your campaign. These serve to provide a visual reinforcement indication for users while they're selecting map "chapters" in the UI. To do so, create a new folder named 'MissionPics' under the vgui folder ...\swarm\addons\infested\materials\vgui\MissionPics In this folder, you'll want to create a .VTF/.VMT pair for each map you wish to create. They should each be 256 by 256 pixels and be representative of the mission in some way. Once you've created your custom mission image, you'll want to edit the mission's overview file (which we placed in '...\swarm\resource\overviews\'). Objective Images Just like the mission thumbnails, we can create custom images for you mission's objectives. Once created, your objective image can be defined in the Hammer objective entity (see Swarm_Objectives) inside your .VMF (see examples located in the example .VMF files here ...\alien swarm\sdk_content\mapsrc\tutorial\ Mission Overview Map You can optionally create an overview map for each mission that you've created, but you must create objective files for all of your missions. Under the 'resource' in your addon path, create a folder called 'overviews'. In here you should place an overview file for every mission (.BSP) that you have made. These files need to be named the same as the .BSP file. (see the files in '...\swarm\addons\ExampleAddon\resource\overviews\' as an example) ...\swarm\addons\infested\resource\overviews For more detailed information on creating overview maps, see this page Swarm_Overview_Map. Create metadata files There are a few more files that you will make in order to allow your add-on content to function in game. addoninfo.txt The first is the addoninfo.txt file. This allows your content to be recognized by the game. It should go inside your add-on root folder, which was the first one we created way back at the top ...\swarm\addons\infested\addoninfo.txt This file is used by the game in the Extras- Add-ons screen. It describes your add-on in general and what it provides. The example (...\swarm\addons\ExampleAddon\addoninfo.txt) includes comments and instructions for using it as a template for your own add-on. addonimage.jpg Another file you can create in the root folder is an image named addonimage.jpg. This serves as an icon to help differentiate your add-on and is displayed when an add-on is selected in the UI along with add-on details listed in the addoninfo.txt. Some JPG files may not work, depending on which application they are saved from. If you're having trouble getting you JPG to work, try exporting it from VTFEdit. Test it out At this point, your add-on should be fully functional. You should be able to launch the game, go to Extras- Add-ons, and enable your add-on. If you type path into the console, you should see the root directory of your add-on near the bottom. This means that the game will search your add-on folder for files that it cannot find in the standard game .VPK files. You can continue tweaking your content in folder form until you're ready for that magical moment Release into the wild. Packaging and shipping The final remaining step is to package your add-on into a .VPK for distribution. The .VPK serves as a convenient, one file method for others to install your add-on folder. They need simply put the .VPK in their own add-on folder. Or, assuming they, like most non-authoring players, haven't associated the .VPK extension with something else, they can double click on it and it will install itself in the correct place. Every .VPK file contains a unique ID that allows the game to ensure everyone is running the same content. If you've put in meta-data properly, the game will also prompt users to download a newer version if it is required to play. Navigate to this folder C \Program Files\Steam\steamapps\common\alien swarm\bin\ Locate the vpk.exe packaging utility and make a shortcut to it on your desktop. Drag your add-on root folder and drop it onto the shortcut. The utility should make a new .VPK next to your original folder. By default it will not include source files such as .VMF, .TGA, .SMD, .QC etc., and it will always strip out executable binaries. Remove the folder version of the add-on (or move it to a safe location) so that the .VPK is alone and test it out. The .VPK should function exactly as the add-on folder does. If it works, you're ready to upload it to a location you specified in the metadata files and from which it is available. Ideally, you'll want an add-on "homepage" that includes ratings, screenshots, and player comments. A simple L4D example can be found here. Compression Since full Alien Swarm campaigns can be very large it is advisable to compress them before uploading to file sharing sites for distribution. The open source Windows utility 7-zip supports compressing files in the 7z format/LZMA algorithm, which provide a very high compression ratio. The bulk of a campaigns size comes from the .bsp map files, which are highly compressible, so a vpk can be reduced to 25% or less of its original size. For example an unofficial version of Death Aboard was packaged up by a fan; the vpk was 267MB uncompressed, 92MB zipped, and 55MB with 7z. Final testing At this point, you should test out the download prompt. Start a lobby with a local server, and invite a friend to join. When they accept, they should be prompted to download the necessary add-on, after which a browser window will opened to your add-on homepage. They should be able to download and install the add-on without having to restart the game, and then join your lobby. See also VPK VPK File Format
https://w.atwiki.jp/mrfrtech/pages/93.html
Market Scenario The global Identity And Access Management Market has been expected to increase at a CAGR of 13.50%, with a value of USD 35.71 billion during the estimated forecasting year of 2030. The demand for identity and access management market is gaining traction due to the ring of regulatory compliances and security concerns. It also matters more than the increasing cloud adoption is one of the most important factors responsible for the growth of the identity and access management market sectors around the world. However, the integration of advanced technologies like blockchain as well as artificial intelligence into the identity and access management market solutions has been expected to raise the growth of the entire market sector within the upcoming time. It allows the organizations to manage the lifecycle of the identities like employees, contractors and vendors. Cloud technology is changing the way of business and other essential work while it is driven by cost efficiency and the economics of sale. Furthermore, the lack of effective security can undermine the benefits of cloud computing. This marks the fundamental need for security solutions that include security for identity-related crimes, and thus it drives the market for identity and access management. Secure the networks, and the digital assets have become an important component of every business. Hackers do not only commit the data breaches, but the individuals also commit many within an organization who have access to sensitive parts of the networks or facilities. Among these types of cloud deployment used in the market, the public cloud accounted for the largest share due to its increased adoption across the verticals. Due to the spread of the epidemic, the organizations have adopted remote work culture and cloud technology to mitigate the impact on the business operations. Request a Free Sample @ https //www.marketresearchfuture.com/sample_request/2635 Competitive Outlook The key participants identified by MRFR operating in the global identity access management market are– F5 Networks (U.S.), Amazon Web Services (U.S.), HP (U.S.), IBM (U.S.), Microsoft Inc. (U.S.), Oracle Corporation (U.S.), Siemens AG (Germany), Dell Inc. (U.S.), CA Technologies (U.S.), ForgeRock Inc. (U.S.) among others. Segmentation The global identity and access management market has been divided into solutions, deployment, organization size, end-user verticals and regional analysis. The solution section further divides the market into five parts identity cloud, identity governance, access management, directory services, and other solutions. The deployment section further divides the market into three parts on-premise, hybrid and cloud-based. As per the organization part, the entire market has been segmented into two categories large enterprises and small medium enterprises. The identity and access management market is further classified into eight sections BFSI, IT telecom, education, healthcare, retail, energy, manufacturing, and other end-user verticals with end-user verticals. As per the regional basis, the market is divided into five parts Asia-pacific, Europe, North America, South America, and Middle East Africa. Regional Analysis Over the last few times, several data breaches have been reported in the Northern American region. These breaches have affected several end-user segments ranging from IT and telecom, healthcare, to the energy sector. The data breach affected around 2.7 million people and 173,000 businesses. The leaked information includes names, addresses, birth dates, email addresses and information about the transaction habits. Besides this, the region's healthcare sector also can defend against the cyber threats that its employees seriously undermine. Industry News In Canada, the prevention of attacks on organizations, the IT budgets of the companies increased by 11% between 2014 and 2017. In the United States, the IT sector has spent on security solutions to reach USD 66 billion. Browse Full Report Details @ https //www.marketresearchfuture.com/reports/identity-access-management-market-2635 Table of Contents 1Executive Summary 2Scope of the Report 2.1Market Definition 2.2Scope of the Study 2.2.1Research objectives 2.2.2Assumptions Limitations 2.3Markets Structure Continued…. Similar Report***** Mixed Reality Market Research Report https //writeonwall.com/mixed-reality-market-by-development-size-share-and-demand-opportunity-size-share-trend-intel-corporation-u-s-sony-corporation-japan/ Smart Glass Market https //writeonwall.com/smart-glass-market-by-development-size-share-and-demand-opportunity-size-share-key-manufacturers-drivers-value-and-foreseen-2027/ Passport Reader Market https //writeonwall.com/passport-reader-market-by-development-size-share-and-demand-opportunity-it-security-and-data-protection-analysis-forecast-to-2030/ About Market Research Future At Market Research Future (MRFR), we enable our customers to unravel the complexity of various industries through our Cooked Research Report (CRR), Half-Cooked Research Reports (HCRR), Raw Research Reports (3R), Continuous-Feed Research (CFR), and Market Research Consulting Services. Contact Market Research Future (Part of Wantstats Research and Media Private Limited) 99 Hudson Street, 5Th Floor New York, NY 10013 United States of America 1 628 258 0071 (US) 44 2035 002 764 (UK) Email sales@marketresearchfuture.com Website https //www.marketresearchfuture.com
https://w.atwiki.jp/michealfeng/pages/12.html
Diaper luggage by designers are now coming in different stylish models. You could oversight their diaper baggage as the normal bags inside the marketplace for girls. Timi and Leslie luggage have revealed lots of versatility paired with stylish elegance. Plus they remained their trademark in creating diaper luggage. They may have developed bags in several hues this sort of as black, brown, bronze, blue, white, silver, pewter, pink, and purple. But not surprisingly, black is the most sought coloration by most women as it is often paired with practically bao bao issey miyake any coloration. It signifies toughness, boldness, and sometimes insolence. You could quickly match black with formal and everyday attires. Allow me to share the various Timi and Leslie diaper baggage in black that you just would certainly really like to get. Newborn Jane Diaper Bag in Black This black diaper bag is manufactured of fake leather. But you can expect to be confident that it is PVC absolutely free. It has significant excellent tailored antique brass components. This bag has quite a few compartments and pockets so that you can provide all of the requirements you will want inside your exercise outside. It has a crucial fob so that you won t ever drop your keys or possess a tough time locating your keys in the bottom of your bag. Identical to every other Timi and Leslie baggage, this bag also features a Pouchette for Mom s necessities these types of as credit history card, mobile devices, pen, and other people. You will also reach use a diaper changing mat and wipes pocket inside this bag. You might easily connect the stroller strap in the event you wish to relieve your shoulders with all the body weight. It s got an insulated bottle holder with clip to maintain the temperature of your respective baby s drinks. Genvieve II Satchel Diaper Bag in Black This smaller shoulder diaper bag is manufactured of light-weight quilted nylon substance. Furthermore, it has customized hardware in antique brass complete. You won t really have to fear a great deal with regards to the space and arranging because it has 6 inside pockets. It s got also a vital fob which means you will issey miyake tote never come across it hard looking for your keys. This Timi and Leslie bag includes a Pouchette in it wherever Mother can place her smaller necessities within. Bundled are also diaper switching mat and pockets to the wipes. You may protected your baby s bottles within their insulated bottle pockets. Hannah Diaper Bag Tote in Black This Timi and Leslie bag is created of faux leather-based that s PVC totally free. It s got custom created components in antique brass complete. You can also make utilization of it roomy six pockets within for additional requirements to be placed inside. It s got a vital fob to protected your keys to ensure it is going to not get lost. It has a matching Pouchette for Mom s smell points these types of as mobile phones, credit score cards, make ups, and lots of extra. It s got a different strap to help you very easily change its shoulder straps into stroller straps. You will not have got a challenging time changing baby s dirty nappy due to the fact it features diaper shifting mat and also a pocket for baby s damp wipes. Baby s bottle will probably be held harmless and warm in the bag s insulated bottle pocket. The Charlie II Tote Diaper Bag by Timi Leslie in Black This bag has lots of features this sort of as it s stroller straps in it, it s insulated bottle holder, change mat, essential holder, it has 6 inside pockets and many some others. This black bag is created of built from fake leather-based and it is actually PVC no cost. It s got Pouchette in it.
https://w.atwiki.jp/wokeberron/pages/31.html
Magic Item Compendium P217-218 IDENTIFYING ITEMS When PCs find magic items as treasure, they need to determine what the items do. The following methods are available to identify magic items. Skill Checks Certain skills allow a character to accurately identify an item. Knowledge (arcana) A character can attempt a DC 30 Knowledge (arcana) check to determine if she remembers reading of an item at one point during her studies. A successful result might give a hint to the item s function or reveal every detail about it. This method is most appropriate for legendary items or items that have a traditional shape associated with their function. Search You might allow close study of an item to provide some information. A command word could be etched in tiny letters on the inside of a ring, or a feathered design might hint that an item allows its wearer to fly. In such a case, a successful DC 15 Search check should reveal the clue. Spellcraft A character using the detect magic spell can attempt a Spellcraft check to determine the school of magic associated with the item s powers. If the character exceeds the DC for this check by 10 or more, the character magically divines the item s functions, its means of activation, and the number of charges remaining. A character can also use Spellcraft to identify potions. The DC is 25, the check takes 1 minute, and she cannot retry if she fails. Use Magic Device If a character succeeds on a Use Magic Device check to activate a magic item and exceeds the DC by 5 or more, the character magically divines the item s functions, its means of activation, and the number of charges remaining. Bardic, Knowledge While not quite as useful as the skills discussed above, a successful bardic knowledge check might reveal the backgrounds, functions, and means of activating legendary or otherwise well-known items, if the item is standard equipment for a well-known faction or person, the DC is 20. If the item is uncommon or ancient, but many items like it are in circulation, the DC is 25. If the item is known only in legend, the DC is 30 or higher. A successful result should reveal something of the item s history and give at least a hint about the item s function. Spells Spells are the most reliable way to identify items. Detect Magic Obviously, the easiest way for characters to discern whether an object is magic is to use detect magic. When focused on an item, a character can attempt a Spellcraft check to determine the school (or schools) of the highest-level spell (or spells) involved in the item s creation, as well as the strength of the item s aura (based on its caster level). Also, a character making such a check can divine the function of an item by succeeding by 10 or more. When a character uses detect magic on a magic item, the information you provide often serves as a clue to a smart player for identifying the item. See the detect magic spell description, PH 219, for details. Identify The identify spell determines the functions, means of activation, and number of charges remaining for any item of less than artifact power. It takes an hour to cast and has an expensive material component, but it s also the surest way to identify most magic items. See the identify spell description, PH 243, for details. Analyze Dweomer This spell functions like identify, but the casting time is shorter, there s a focus rather than an expensive material component, and the caster can determine the properties of several items with one casting of the spell. This spell is the swiftest and surest way to identify many magic items. See the analyze dweomer spell description, PH 197, for details. Hired Help The PCs might want to consult bards, sages, or high-level spellcasters to identify items through the means outlined above. Such NPCs might also know some details or rumors about an item s history. They always want something in return for this information. The prices for spellcasting services are noted on page 129 of the Player s Handbook and described in more detail on page 130. If an NPC can identify the item without using spells, the character might ask for an amount of gp equivalent to the typical spell cost. Of course, an NPC might instead demand some service or trade instead of money. DM Explanation It might be simpler to tell the players what an item is. This approach is particularly useful when the item provides a bonus you must track on actions the PC is already taking. If you have a PC using an unidentified +2 short sword, for example, use this option when it becomes a burden for you to keep mentally adding +2 to all the character s attack rolls and damage rolls with that unidentified (to him) item. Trial and Error The last refuge of desperate characters with an unidentified magic item, this process is often comical, but it can become an annoying waste of time. The trial-and-error process usually entails a PC attempting to use the item. A character hoping that the cloak he s just found is actually wings of flying might say, "I put the cloak on and jump up and down, flapping my arms." Previous D D supplements, including the Dungeon Masters Guide, have advised rewarding clever characters who pursue this line of inquiry. As long as you and the players find trial and error to be a fun method of learning about magic items, that s still fine advice. If, however, your players turn it into a tedious checklist of tests ("Now I try to breathe underwater. Now I try to walk up the wall. Now I think about turning invisible. No luck? Maybe it only works for dwarves; Tordek, now you try it."), it s time to step in and move the game along. It s perfectly reasonable to rule that until a character has determined a magic item s powers, command word, or other secrets in one of the manners noted above, no amount of crazy experimentation will help. アイテム識別 PC達が略奪したマジックアイテムを使う際にはその機能を研究する必要がある。 以下の方法は、マジックアイテムを識別するために利用できる。 技能チェック: 特定の技能によって、正確にアイテムを特定することができる。 知識(神秘学): あなたがニートしている間にそのアイテムについて(Wikipediaで)読んだことを憶えているかどうかを、知識(神秘学)DC30で試みることがでる。 成功した場合、アイテムの機能のヒント、またはあらゆる詳細を知ることができるかもしれない。 この方法は、伝説的なアイテムや機能と関連した伝統的な形を持つアイテムを識別するのに最適です♪ 捜索: アイテムを詳細に検討することにより若干の情報を得ることができるかもしれません。 必死すぎワロス。 コマンドワードがリングの内側に小さい文字で彫り込まれているのを見つけることができる。しかしながらこの試みは危険が伴う。FOREVER LOVE モンテ×コーデルなどの見てはいけないものを ― 不幸にも ― 見てしまった場合にはSANチェックを行う必要がある。 あるいは、羽毛のデザインはアイテムによってその着用者が飛ぶことができるとほのめかすイーツ。 このような場合DC15の捜索判定に成功することにより明らかにできる。 呪文学: ディテクトマジックを使っているキャラクターは、呪文学判定を用いアイテムに宿る魔法の系統を明らかにすることができる。 もしこの判定のDCを10以上上回るなら、アイテムの機能、起動方法、残っているチャージ数を魔法のように知ることができる。 ポーションを識別する際にも呪文学を用いることができる。 DCは25で、判定には1分間かかる。失敗した際に再挑戦することはできない。 魔法装置使用: マジックアイテムを起動する魔法装置使用の判定に5以上上回って成功したならば、アイテムの機能、起動方法、残っているチャージ数を魔法のように知ることができる。 バードの知識: 上記で論じられた技能ほどバードの知識は有用ではないが、判定に成功した場合、伝説などでよく知られるアイテムの背景、機能、起動方法を明らかにするかもしれない。 有名な組織、人物のもので標準的な装備ならばDC20。 まれであったり非常に古いがよく流通しているアイテムの場合はDC25。 伝説の中でのみ語られるアイテムならばDC30以上。 さらに慣用句を合成しすぎるアメリカ人に俺がプッツンせずにすむかどうかを決定するセーブDCは40である。 バードの知識判定のに成功した場合、アイテムの歴史や少なくとも機能の手がかりを明らかにしなければならない。 プレハンと同じこと書いておけばいいのになぜ持って回った言い方をするのかと小一時間。 呪文: 各呪文の解説やら上記の呪文学と同じ内容が書いてある。略 ディテクトマジック: アイデンティファイ: アナライズオヴドゥエオマー: 助けを借りる: PC達は上記の方法でアイテムを識別するためにバードや賢人や高レベルのキャスターに相談するかもしれません。 そいつらは何らかの対価を要求してくるよ!って書いてあった。当たり前田のクラッカー。終わる。 DMへの提言 アイテムの効果言ってもいいんじゃね? 未鑑定のアイテムぶん回してる時にいちいち心の中でボーナス計算するのめんどいっしょ?w 試行錯誤 滑稽で面白いが腹立たしい時間の浪費になることがある。 DMもプレイヤーも楽しめるなら可。 システマチックに鑑定して行こうとするならやめとけ。ってことが書いてあったよ、終われ。 要約 知識(神秘学)DC30でそのアイテムについて学んだことがある 捜索DC15でそのアイテムにコマンドワードが書いてあれば見つけられたり、イラストが描かれていたら機能を想像できる。 ディテクトマジックの呪文学でDCを10上回れば、アイテムの機能を予想し、起動手段、チャージ数までわかる 魔法装置使用でも起動に必要なDCを5上回れば同様なことがわかる バードの知識ではわからない 僕が途中で飽きているのは確定的に明らか
https://w.atwiki.jp/ntemacs/pages/43.html
■ MinGW版 Emacs 特有の設定 【お知らせ】 2019/07/30 追記 最新の Thuderbird で External Editor が動かない件については、次の情報があります。 http //zetamatta.hatenablog.com/entry/2017/06/01/105852 2017/11/28 追記 WSL の Emacs と連携可能な emacsclient コマンドも作成しています。次のページを参照ください。 WSL の emacsclient を Windows から利用するための設定 2017/11/28 追記 gnupack の emacsclient コマンドは、startup_emacsclient.exe を利用できます。emacsclient のオプションは、 startup_config.ini ファイルの [startup_emacsclient.exe] セクションで設定できるようになっています。 2017/11/13 追記 Thunderbird のアドオンである External Editor は、設定がうまくできなくなっているようです。(OK ボタンを押せない..。) 【本題】 emacsclientw を使うための設定です。「Windows の操作を Emacs のキーバインドで行うための設定 (Keyhac版)」を使うことで、2) と 3) の必要性はあまり感じませんが、4) は「emacs-eclim を使うための設定 」と連携する上で便利かと思います。 1) emacsclientw を使うためのベースの設定を行う。 次のページを参照して設定してください。 http //shigemk2.hatenablog.com/entry/2013/11/21/gnupack%E3%81%A7emacsclient%E3%82%92%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84 ただし、次のページの内容と同じ問題が発生するので、Emacs の設定は以下とおりとしている。 http //chanpon-memo.blogspot.jp/2013/11/sendto-emacs.html (require server) (server-force-delete) (server-start) 2) Windows のテキストファイルを emacsclientw を利用して Emacs で開けるようにする。 (1) テキストファイルを右クリックして「プログラムから開く」→「既定のプログラムの選択」をクリックする。 (2) 「参照」ボタンをクリックし、emacsclientw.exe を指定する。 (3) 「この種類のファイルを開く時は、選択したプログラムをいつも使う」にチェックを付ける。 3) Thunderbird の外部エディタとして Emacs を利用できるようにする。 次のページを参照して設定してください。 http //news.mynavi.jp/articles/2014/02/06/thunderbird/001.html 4) Eclipse の外部エディタとして Emacs を利用できるようにする。 次のページを参照して設定してください。 https //github.com/anirudhsasikumar/emacs-eclipse ファイルを Emacs で開こうとして「Emacsclient ERROR」のダイアログが表示される場合は、一度 PC をリスタートしてみてください。 上記の他、Eclipse のメニューから以下を辿って、ファイルタイプのエディターに emacsclientw を追加する方法があります。 ウインドウ 設定 一般 エディター ファイルの関連付け 前者の設定の方が、Emacsアイコンの設定がされたり、Emacs でファイルを開いた際にカーソルの移動をしてくれたりと機能が優れていますが、後者の設定の方が plugin の追加の必要がないため、お手軽かと思います。 なお、emacsclientw で開いたバッファの終了は、C-x # となります。 変更履歴 2014/09/29 このページを作成した。
https://w.atwiki.jp/xrayroom/pages/149.html
一般撮影室@wikiは 新サイト に移行しました。 The English version of the new website is available here !! Tangential view・肘関節45°屈曲位撮影・上腕骨小頭撮影 正面像で投影されにくい軟骨炎像を接線で投影可能であり、上腕骨小頭離断性骨軟骨炎の診断に有用。 →離断性骨軟骨炎は軟骨下骨の一部が壊死に陥り、その表面を覆う関節軟骨とともに周囲から分離し、関節内に遊離体を形成する(引用:画像解剖に基づく単純X線写真の撮影法と読影のポイント) 上腕骨小頭離断性骨軟骨炎が疑われる場合、 45°屈曲位正面撮影と45°外旋斜位撮影が有用 。 【撮影前チェック】 検側はどちらか確認する。 【ポジショニング】 座位。 肘関節正面撮影の体位から前腕を下げ、上腕とカセッテのなす角度を45°とする。 【X線入射点/距離】 肘の内側の皺から1横指遠位の点に垂直入射。 100cm 【撮影条件】 50kV/4mAs リスなし 【チェックポイント】 【画像】 http //www.kawasaki-hospital-kobe.or.jp/medical/department/cartilage/X_xian_cuo_ying_fa.html